package br.unisal.repository;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import br.unisal.domain.Cliente;
import br.unisal.factory.ClienteFactory;
import br.unisal.reader.LeitorXML;

public class ClienteRepository {

	private List<Cliente> clientes = new ArrayList<Cliente>();
	private Cliente clienteSemCadastro;
	private ClienteFactory  fabricaCliente;
	
	public ClienteRepository() {
		fabricaCliente = new ClienteFactory();
		
		//this.clientes.add(fabricaCliente.criaCliente("1111", "Red", "bill", "ari", 120, "sumare", "centro",	"igreja matriz"));
		//this.clientes.add(fabricaCliente.criaCliente("2222", "bill", "red", "ari", 120, "sumare", "centro",	"igreja matriz"));
		
		clienteSemCadastro = fabricaCliente.criaCliente("", "Sem cadastro", "",	"", 0, "", "", "");

		this.clientes = new LeitorXML().leClientes();
		
		this.ordenaClientes();
	}

	private void ordenaClientes(){
	    Collections.sort (this.clientes, new Comparator<Cliente>() {  
		@Override
		public int compare(Cliente c1, Cliente c2) {

			return c1.getPrimeiroNome().compareToIgnoreCase(c2.getPrimeiroNome());
		}  
	    });  
	}
	
	public Cliente consultaCliente(String telefone) {
		Cliente clienteRetorno = null;
		clienteRetorno = consultaClientePorTelefone(telefone, clienteRetorno);
		clienteRetorno = tratarNull(clienteRetorno);
		return clienteRetorno;
	}

	private Cliente tratarNull(Cliente clienteRetorno) {
		if (clienteRetorno == null) {
			clienteRetorno = clienteSemCadastro;
		}
		return clienteRetorno;
	}

	private Cliente consultaClientePorTelefone(String telefone,	Cliente clienteRetorno) {
		for (Cliente cliente : clientes) {

			if (cliente.getTelefone().equals(telefone)) {

				clienteRetorno = cliente;
			}

		}
		return clienteRetorno;
	}

	public void adicionaCliente(Cliente cliente) {

		boolean clienteJaCadastrado = false;
		for (Cliente clienteCadastro : clientes) {

			if (cliente.getTelefone().equals(clienteCadastro.getTelefone()))
				clienteJaCadastrado = true;
		}

		if (!clienteJaCadastrado) {
			clientes.add(cliente);
		}
	}

	public void excluiCliente(Cliente cliente) {
		clientes.remove(cliente);
	}
	
	public List<Cliente> retornaListaClientes(){
		return this.clientes;
	}
}
